/**
 * 实现一个类，其实例可以链式调用，它有一个 sleep 方法，可以 sleep 一段时间后再后续调用
 *
 * const boy = new PlayBoy('Tom')
 * tom.sayHi().play("basketball").sleep(1000).play("volleyball");
 * 输出
 * 大家好我是Tom
 * 我在玩篮球
 * 1s之后
 * 我在玩排球
 */

class PlayBoy {
  constructor(name) {
    this.name = name;
    this.task = [];
    //   保证所有的方法都没塞进任务列表之后，再进行调用
    setTimeout(() => {
      this.next();
    }, 0);
  }

  sayHi() {
    this.task.push(() => {
      console.log(`大家好，我是${this.name}`);
      this.next();
    });
    return this;
  }
  play(game) {
    this.task.push(() => {
      console.log(`我在玩${game}`);
      this.next();
    });
    return this;
  }
  sleep(time) {
    this.task.push(() => {
      setTimeout(() => {
        console.log(`after ${time} ...`);
        this.next();
      }, time);
    });
    return this;
  }

  next() {
    const fn = this.task.shift();
    fn && fn();
  }
}

const tom = new PlayBoy("Tom");

tom.sayHi().play("basketball").sleep(1000).play("volleyball");
